package co.com.travelsoft.ati.administrador.interfaz;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import javax.swing.text.MaskFormatter;

import co.com.travelsoft.ati.administrador.DelegadoNegocio;
import co.com.travelsoft.ati.dto.CiudadDto;
import co.com.travelsoft.ati.dto.PaisDto;
import co.com.travelsoft.ati.entities.EventoDto;
import co.com.travelsoft.ati.entities.TipoEventoDto;
import co.com.travelsoft.ati.exception.TravelSoftException;

public class PanelRegistrarEventos extends JPanel implements ActionListener, ItemListener{
	
	private JLabel jlPaisEvento = null;
	private JLabel jlCiudadEvento = null;
	private JLabel jlTipoEvento = null;
	private JLabel jlNombreEvento = null;
	private JLabel jlFechaIniEvento = null;
	private JLabel jlFechaFinEvento = null;
	private JLabel jlFechaIniEventoF = null;
	private JLabel jlFechaFinEventoF = null;
	private JComboBox jcbPaises = null;
	private JComboBox jcbCiudades = null;
	private JComboBox jcbTipoEvento = null;
	private JTextField jtfNombreEvento = null;
	private JFormattedTextField jfFechaIniEvento = null;
	private JFormattedTextField jfFechaFinEvento = null;
	private JButton botonCrearEvento = null;
	private JButton botonCancelar = null;
	private TitledBorder tituloPanel;
	
	private GUIAdministrador framePrincipal = null;
	
	private DelegadoNegocio delegado;
	private List<EventoDto> eventos;
	private List<PaisDto> listaPaises;
	private List<TipoEventoDto> listaTiposEvento;
	private Hashtable<BigDecimal,List<CiudadDto>> listasCiudades;
	
	
	
	
	public PanelRegistrarEventos(GUIAdministrador framePpal) throws Exception
	{
		framePrincipal = framePpal;
		iniciarComponentes();
	}
	
	public void iniciarComponentes() throws Exception
	{
		jlPaisEvento = new JLabel("Pais");
        jcbPaises = new JComboBox();      
        jcbPaises.addItemListener(this);
		jlCiudadEvento = new JLabel("Ciudad");
		jcbCiudades = new JComboBox();        
		
		jlTipoEvento = new JLabel("Tipo");
        jcbTipoEvento = new JComboBox();        
        jlNombreEvento = new JLabel("Nombre");
		jtfNombreEvento = new JTextField("");
		
		jlFechaIniEvento = new JLabel("Fecha Inicio");
		jfFechaIniEvento = new JFormattedTextField(new MaskFormatter("##/##/####"));	
		jfFechaIniEvento.setToolTipText("DD/MM/YYYY");
		//jfFechaIniEvento.setFont(new Font("Arial", Font.BOLD, 15));
		//jfFechaIniEvento.setForeground(Color.BLUE);
		//jfFechaIniEvento.setHorizontalAlignment(JFormattedTextField.RIGHT);
		
		jlFechaFinEvento = new JLabel("Fecha Final");
		jfFechaFinEvento = new JFormattedTextField(new MaskFormatter("##/##/####"));		
		jfFechaFinEvento.setToolTipText("DD/MM/YYYY");
		//jfFechaFinEvento.setFont(new Font("Arial", Font.BOLD, 15));
		//jfFechaFinEvento.setForeground(Color.BLUE);
		//jfFechaFinEvento.setHorizontalAlignment(JFormattedTextField.RIGHT);
		
		
		JPanel parametrosPanel = new JPanel(new GridLayout(3, 4, 5, 5));
		TitledBorder titledBorder = new TitledBorder("Consulta de eventos");
		parametrosPanel.setBorder(titledBorder);
		parametrosPanel.add(jlNombreEvento);
		parametrosPanel.add(jtfNombreEvento);
		parametrosPanel.add(jlTipoEvento);
		parametrosPanel.add(jcbTipoEvento);
		parametrosPanel.add(jlPaisEvento);
		parametrosPanel.add(jcbPaises);
		parametrosPanel.add(jlCiudadEvento);
		parametrosPanel.add(jcbCiudades);
		parametrosPanel.add(jlFechaIniEvento);
		parametrosPanel.add(jfFechaIniEvento);
		parametrosPanel.add(jlFechaFinEvento);
		parametrosPanel.add(jfFechaFinEvento);
		
		
		
		botonCrearEvento = new JButton("Crear Evento");
		botonCrearEvento.addActionListener(this);
		botonCancelar = new JButton("Cancelar");
		botonCancelar.addActionListener(this);
		
		JPanel botonesPanel = new JPanel();
		botonesPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
		botonesPanel.add(botonCrearEvento);
		botonesPanel.add(botonCancelar);
		
		setLayout(new BorderLayout( 5, 5));
		add(parametrosPanel, BorderLayout.CENTER);
		add(botonesPanel, BorderLayout.SOUTH);
		
		setSize(400, 200);
		
		delegado = DelegadoNegocio.getInstancia();
		
		cargarComboPaises();
		cargarComboCiudades();
		cargarComboTiposEvento();
		
	}
	
	public void cargarComboPaises()
	{
		try {
			listaPaises = delegado.listarPaises();
			DefaultComboBoxModel items = new DefaultComboBoxModel();
			for ( PaisDto pais : listaPaises )
				items.addElement(pais);
			
			jcbPaises.setModel(items);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			JOptionPane.showMessageDialog(null, "No se pudo listar los paises.");
			e.printStackTrace();
		}
	}
	
	public void cargarComboCiudades()
	{
		try {
			if ( listasCiudades == null ) {
				// Inicializa la matriz de ciudades por pais
				listasCiudades = new Hashtable<BigDecimal, List<CiudadDto>>();
				
				// Crea una lista vacia de ciudades por cada pais
				for ( PaisDto pais : listaPaises )
					listasCiudades.put(pais.getCodigo(), new ArrayList<CiudadDto>());
				
				// Llena la listas de ciudades de cada pais
				List<CiudadDto> listaTodasLasCiudades = delegado.listarCiudadesDePais();
				for ( CiudadDto ciudad : listaTodasLasCiudades ) {
					listasCiudades.get(ciudad.getPaises().getCodigo()).add(ciudad); 
				}
			}
			
			//Pais seleccionado
			int indicePaisSeleccionado = jcbPaises.getSelectedIndex();
			System.out.println("Ind: "+ indicePaisSeleccionado );
			PaisDto paisSeleccionado = listaPaises.get(indicePaisSeleccionado);
			System.out.println("pais: "+ paisSeleccionado.getNombre() );
			List<CiudadDto> listaCiudadesPaisSeleccionado = listasCiudades.get(paisSeleccionado.getCodigo());
			System.out.println("ciudades: "+ listaCiudadesPaisSeleccionado.toString() );
			
			DefaultComboBoxModel items = new DefaultComboBoxModel();
			for ( CiudadDto ciudad : listaCiudadesPaisSeleccionado )
				items.addElement(ciudad);
			
			jcbCiudades.setModel(items);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			JOptionPane.showMessageDialog(null, "No se pudo listar las ciudades.");
			e.printStackTrace();
		}
	}
	
	private void cargarComboTiposEvento()
	{
		try {
			listaTiposEvento= delegado.listarTiposEventos();
			DefaultComboBoxModel items = new DefaultComboBoxModel();
			for ( TipoEventoDto tipo : listaTiposEvento )
				items.addElement(tipo);
			
			jcbTipoEvento.setModel(items);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			JOptionPane.showMessageDialog(null, "No se pudo listar los tipos de eventos.");
			e.printStackTrace();
		}
	}
	
	private void RegistrarEvento()
	{
		delegado = DelegadoNegocio.getInstancia();
		
		TipoEventoDto tipoEvento = (TipoEventoDto) jcbTipoEvento.getSelectedItem();
		CiudadDto ciudadEvento = (CiudadDto) jcbCiudades.getSelectedItem();
		
		EventoDto nuevoEvento = new EventoDto();
		nuevoEvento.setCiudad(ciudadEvento);
		nuevoEvento.setEstado(new BigDecimal(1));
		nuevoEvento.setTipoEvento(tipoEvento);        		
		
		SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
		String strFecha = "";
		Date fechaInicio = null, fechaFin = null;
		
		try {
			strFecha = jfFechaIniEvento.getText();
			fechaInicio = formatoDelTexto.parse(strFecha);
			
			strFecha = jfFechaFinEvento.getText();
			fechaFin = formatoDelTexto.parse(strFecha);
		} catch (ParseException e2) {
			e2.printStackTrace();
		}
		
		nuevoEvento.setFechafin(fechaFin);
		nuevoEvento.setFechainicio(fechaInicio);
		nuevoEvento.setNombre(jtfNombreEvento.getText());
		
		try {
			delegado.crearEvento(nuevoEvento);
		} catch (TravelSoftException e1) {

			e1.printStackTrace();
		}

	}
	
	@Override
	public void actionPerformed(ActionEvent e)
    {
		Object componente = e.getSource();
        		
        if(componente == botonCancelar)
	  	{
        	framePrincipal.remove(this);        	
        	framePrincipal.repaint();
        	
	  	}
        else
        	if(componente == botonCrearEvento)
        	{
        		RegistrarEvento();
    	  	}
    }
	
	@Override
	public void itemStateChanged(ItemEvent evt) {
		// TODO Auto-generated method stub
		if ( evt.getItem().equals(jcbPaises.getSelectedItem())) {
			System.out.println(evt.getSource().toString());
			cargarComboCiudades();
			//ciudadComboBox.repaint();
		}
	}
	
	
}
